package src.ui;

import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem ;
import javax.swing.JScrollPane;

import src.logica.DiedMerger;
import src.util.mdi.MDIDesktopPane;




/**
 * Esta clase representa el formulario principal que contiene los componentes
 * m�nimos a utilizar en el desarrolo de la aplicaci�n correspondiente al 
 * Trabajo Pr�ctico N� 1 de Dise�o e Implementaci�n de Estructuras de Datos.
 * Universidad Tecnol�gica Nacional - Facultad Regional Santa Fe. 
 * 
 * @author C�tedra DIED 2008.
 */
public class FusorMain extends JFrame implements	ActionListener {
	
	private int nroTexto;
	private static final long serialVersionUID = -2811861569233422674L;
	static final int desktopWidth = 640;
	static final int desktopHeight = 480;
	static final int panelHeight = 90;	

	private MDIDesktopPane panelPrincipal;
	private JScrollPane scrollPane;
	private Vector<DocumentoDeTexto> documentosAbiertos;
	private JMenu menuArchivo;
	private JMenu menuOpciones;
	private JMenuItem menuItemNuevo;
	private JMenuItem menuItemMerge;
	private JCheckBoxMenuItem menuItemCompararPalabras;
	private JMenuBar barraDeMenus;
	private PanelDeComandos panelDeComandos;
	
	private int idDocs = 0;
	private int idSeleccionado = -1;
 
	
	/**
	 * Constructor del Frame.
	 * @throws HeadlessException
	 */
	public FusorMain() throws HeadlessException {
		
		super();
		this.inicializarVentana();
	}
 
	
	/**
	 * M�todo que inicializa los par�metros de la ventana.
	 */
	private void inicializarVentana() {
		
		this.setTitle("Fusor Versi�n 0.01 ");
		JFrame.setDefaultLookAndFeelDecorated(true);
		
		
		ImageIcon logo = createImageIcon("/src/img/scriptor.gif","Logo de la aplicaci�n");
		
		this.setIconImage(logo.getImage()) ;

		//Setear la GUI.
		scrollPane = new JScrollPane();
		panelPrincipal = new MDIDesktopPane();
		panelPrincipal.putClientProperty("JDesktopPane.dragMode",
							  "outline");
		//Como usamos pack, no es suficiente llamar a setSize.
		//Debemos setear el tama�o preferido del panel principal.
		panelPrincipal.setPreferredSize(new Dimension(desktopWidth, desktopHeight));
		
		scrollPane.getViewport().add(panelPrincipal);
	    
		menuArchivo = new JMenu("Archivo");
		menuOpciones = new JMenu("Opciones");
		
		menuItemNuevo = new JMenuItem("Nuevo");
		menuItemMerge = new JMenuItem("Fusionar");
		
		menuItemCompararPalabras = new JCheckBoxMenuItem("Comparar palabras");
		    
		menuItemNuevo.addActionListener(this);
		menuItemMerge.addActionListener(this);
		
		menuArchivo.add(menuItemNuevo);
		menuArchivo.add(menuItemMerge);
		menuOpciones.add(menuItemCompararPalabras);
	    
		barraDeMenus = new JMenuBar();
	    
		barraDeMenus.add(menuArchivo);
		barraDeMenus.add(menuOpciones);
		
		this.setJMenuBar(barraDeMenus);
		
		panelDeComandos = new PanelDeComandos(this);
		
		this.getContentPane().add("North",scrollPane);
		this.getContentPane().add("South",panelDeComandos);
		
		panelDeComandos.mensajeDeInformacion("Bienvenido a la versi�n inicial de Fusor");
	    
		documentosAbiertos = new Vector<DocumentoDeTexto>();
	    
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	/**
	 *
	 */
    private static void createAndShowGUI() {
        JFrame.setDefaultLookAndFeelDecorated(true);

		FusorMain ventana = new FusorMain();
		ventana.pack();
		ventana.setVisible(true);
    }


    public static void main(String[] args) {
        //Calendarizar un trabajo para el hilo de env�o de eventos:
        //creaci�n y muestra de la ventana principal.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
    
	/**
	 * Manejo de una acci�n, que puede ser:
	 * 	- Click sobre un �tem de men�.
	 * 
	 */
	public void actionPerformed(ActionEvent arg0){
		
		if(arg0.getSource().equals(this.menuItemNuevo)){
			this.nroTexto++;
			this.cargarTexto(new DocumentoDeTexto("Texto"+this.nroTexto,this));
		}
		else if(arg0.getSource().equals(this.menuItemMerge)){
			if(this.documentosAbiertos.size()<2){
				this.panelDeComandos.mensajeDeError("No hay suficientes documentos de texto abiertos");
			}
			else{
				String texto1 = documentosAbiertos.get(0).getTexto();
				String texto2 = documentosAbiertos.get(1).getTexto();
				Vector<String> parametros = new Vector<String>();
				if(this.menuItemCompararPalabras.isSelected()){
					parametros.add("contarpalabras = true");
				}
				String merged = DiedMerger.merge(texto1, texto2, parametros);
				this.cargarTexto(new DocumentoDeTexto(merged,"Documento fusionado",this));
				this.panelDeComandos.mensajeDeInformacion("Documentos fusionados correctamente");
			}
		}
	}
    
	/**
	 * Ubica el documento dentro del panel principal de la aplicaci�n.
	 * @param documento 	Documento a ubicar.
	 */
	private void ubicarDocumento(DocumentoDeTexto documento) {
		documento.setLocation(12*documento.getId(),9*documento.getId());
	}
	
	/**
	 * Accin de cargar un documento.
	 * @param documentoNuevo 	Documento a cargar.
	 */
	private void cargarTexto(DocumentoDeTexto documentoNuevo) {
		 this.documentosAbiertos.addElement(documentoNuevo);
		 documentoNuevo.setId(idDocs++);
		 ubicarDocumento(documentoNuevo);
		 panelPrincipal.add(documentoNuevo);
	      try {
	        	documentoNuevo.setSelected(true);
	        } catch (java.beans.PropertyVetoException e) {}
	        
	     this.idSeleccionado = documentoNuevo.getId();
		 documentoNuevo.setVisible(true);
	}

	
	/**
	 * 
	 * @param path
	 * @param description
	 * @return ImageIcon
	 */
	protected ImageIcon createImageIcon(String path, String description) {
		java.net.URL imgURL = getClass().getResource(path);
		if (imgURL != null)
		{
			return new ImageIcon(imgURL, description);
		}
		else {
			System.err.println("Archivo no encontrado: " + path);
			return null;
		}
	}
	
	
	/**
	 * 
	 * @param mensaje
	 */
	public void mensajeDeInformacion(String mensaje) {
		
		this.panelDeComandos.mensajeDeInformacion(mensaje);
	}
	
	/**
	 * 
	 * @param mensaje
	 */
	public void mensajeDeError(String mensaje){
		
		this.panelDeComandos.mensajeDeError(mensaje);
	}
	
	/**
	 * 
	 * @return Dimension
	 */
	public Dimension getTamActual() {
		
		return (new Dimension(640,480));
	}
	
	
	/**
	 * 
	 * @return DocumentoDeTexto
	 */
	public DocumentoDeTexto getDocumentoActual() {
		
		if(this.idSeleccionado<0)
			return null;
		return ((DocumentoDeTexto)this.documentosAbiertos.elementAt(this.idSeleccionado));
	}	
	
	
	public int getIdSeleccionado() {
		return idSeleccionado;
	}

	public void setIdSeleccionado(int idSeleccionado) {
		this.idSeleccionado = idSeleccionado;
	}	
	
	public void removeDocument(DocumentoDeTexto documentoDeTexto){
		this.documentosAbiertos.remove(documentoDeTexto);
	}

}